/**
 * \file display.cpp
 * \brief Display class implementation
 * \author Marc Laval
 * \version 0.1
 * \date 10/2011
 *
 */

#include "display.h"

//--------------------------------------------------------------------------------------------------------
//Constructeur
Affichage::Affichage(Patrouille *p, int nb_cases, string titre_fen) throw (Erreur)
{

	this->nb_cases = nb_cases;
	this->taille_fen = nb_cases * TAILLE_CASES;
	this->pat = p;

	//Initialisation SDL
    if( SDL_Init(SDL_INIT_VIDEO) != 0)
	{
		Erreur e;
		string str = "Problème pour initialiser SDL ";
		e.message = str+SDL_GetError();
		e.code = -1;
		throw(e);
    }

    //Mettre un titre à la fenêtre
    SDL_WM_SetCaption(title.c_str(), NULL);

    //Ouvrerture d'une surface pour l'affichage de la fenêtre
    screen = SDL_SetVideoMode(taille_fen,taille_fen, 32, SDL_DOUBLEBUF | SDL_HWSURFACE);

    if(screen==NULL)
	{
		Erreur e;
		e.message = "Erreur creation contexte graphique";
		e.code = -1;
		throw(e);
	}


    //On charge toutes les images dans les surfaces associées
    block = SDL_LoadBMP("../../block.bmp");
	drone = SDL_LoadBMP("../../drone.bmp");
	robot = SDL_LoadBMP("../../robot.bmp");
	humain = SDL_LoadBMP("../../humain.bmp");


	//On teste le retour du chargement
    if( (block == NULL) || (drone == NULL) || (robot == NULL) || (humain == NULL))
	{
		Erreur e;
		e.message = "Probleme de chargement des images !";
		e.code = -1;
		throw(e);
	}

	//On met en place la transparence pour les images des agents
	if(SDL_SetColorKey(drone,SDL_SRCCOLORKEY,SDL_MapRGB(drone->format,228,0,255))==-1 ||
		SDL_SetColorKey(robot,SDL_SRCCOLORKEY,SDL_MapRGB(drone->format,228,0,255))==-1 ||
		SDL_SetColorKey(humain,SDL_SRCCOLORKEY,SDL_MapRGB(drone->format,228,0,255))==-1)
	{
		Erreur e;
		e.message = "Erreur transparence";
		e.code = -1;
		throw(e);
	}

}


//--------------------------------------------------------------------------------------------------------
//Destructeur

Affichage::~Affichage()
{
    //On libère les surfaces
    SDL_FreeSurface(this->block);
	SDL_FreeSurface(this->drone);
	SDL_FreeSurface(this->robot);
	SDL_FreeSurface(this->humain);
	SDL_FreeSurface(this->screen);

	//On quitte SDL
	 SDL_Quit();
}

//--------------------------------------------------------------------------------------------------------
//Methode d'affichage à l'ecran

void Affichage::afficher()
{
    int i,j;
    SDL_Rect r = { 0 };
	Point * p;
	float ph;

	//On definit une zone de TAILLE_CASE par TAILLE_CASE que l'on va faire se deplacer dans la fenetre pour afficher chaque cellule.

	r.h = TAILLE_CASES;
	r.w = TAILLE_CASES;
	r.y = 0;
	r.x = 0;

    //On parcours les cases du tableau, r sera le SDL_Rect qui représentera la position de la case courante
    for(i=0;i<this->nb_cases;i++)
	{
		r.y = i*TAILLE_CASES;
    	for(j=0;j<this->nb_cases;j++)
		{
			r.x = j*TAILLE_CASES;
			p = new Point(i,j);

			//On dessine en fonction du type de la case
			if(this->pat->getCarte()->getCellule(*p)->getTypeCase() == tcVide)
			{	//Case Vide
				ph = this->pat->getCarte()->getCellule(*p)->getPheromone();
				SDL_FillRect(screen,&r,SDL_MapRGB(screen->format,ph,ph,ph));
			}
			else if(this->pat->getCarte()->getCellule(*p)->getTypeCase() == tcObstacle)
			{	//Case Obstacle
				SDL_BlitSurface(block, NULL, screen,&r);
			}
			else
			{	//On a un agent dans la case
				if(this->pat->getCarte()->getCellule(*p)->getAgent() != NULL)
				{
					if(typeid(*this->pat->getCarte()->getCellule(*p)->getAgent()) == typeid(AgentDrone))
						SDL_BlitSurface(drone, NULL, screen,&r); //C'est un Drone
					else if(typeid(*this->pat->getCarte()->getCellule(*p)->getAgent()) == typeid(AgentRobot))
							SDL_BlitSurface(robot, NULL, screen,&r); //C'est un Robot
					else if(typeid(*this->pat->getCarte()->getCellule(*p)->getAgent()) == typeid(AgentHumain))
							SDL_BlitSurface(humain, NULL, screen,&r); //C'est un Humain
				}
			}
		}
	}

	SDL_Flip(this->screen);
}

//--------------------------------------------------------------------------------------------------------
//Gestion des evenements
//Renvoie 1 si on a appuye sur 'q'

int Affichage::gerer_evenements(){

	int done = 0;

	//Traiter les évènements
	while(SDL_PollEvent(&event))
	{
		switch(this->event.type)
		{

			case SDL_QUIT:
				done=1;
				break;

			//Si on vient de relâcher une touche de clavier
			case SDL_KEYDOWN:

				if(this->event.key.keysym.sym == SDLK_q)
					done=1;
					break;

			//Sinon on ne fait rien
			default:
				break;
		}

	}
	return done;
}


